package cn.wolfcode.web.controller;


import cn.wolfcode.common.web.CommonCodeMsg;
import cn.wolfcode.common.web.Result;
import cn.wolfcode.domain.OrderInfo;
import cn.wolfcode.feign.AlipayFeignApi;
import cn.wolfcode.service.IOrderInfoService;
import cn.wolfcode.web.msg.SeckillCodeMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;

/**
 * Created by lanxw
 */
@RestController
@RequestMapping("/orderPay")
@RefreshScope
public class OrderPayController {
    @Autowired
    private IOrderInfoService orderInfoService;
    @Autowired
    private AlipayFeignApi alipayFeignApi;
    @RequestMapping("/pay")
    public Result<String> pay(String orderNo, Integer type) {
        if (OrderInfo.PAYTYPE_ONLINE.equals(type)) { // 在线支付
            return Result.success(orderInfoService.payOnline(orderNo));
        }
        if (OrderInfo.PAYTYPE_INTERGRAL.equals(type)){ // 积分支付
            orderInfoService.payIntegral(orderNo);
            return Result.success("");
        }
        return Result.error(CommonCodeMsg.ILLEGAL_OPERATION);
    }


    @RequestMapping("/notify_url")
    // 支付宝的异步回调(包含业务逻辑)
    public String notifyUrl(@RequestParam HashMap<String,String> params){
        // 远程调用支付服务的验签功能
        Result<Boolean> result = alipayFeignApi.rsaCheckV1(params);
        if (result == null || result.hasError()) { // 支付不可用---此时用户的钱还没付出去
            return "fail";
        }
        Boolean flag = result.getData(); // 获取验签结果
        if (flag) { // 验签通过
            // 获取商户订单号
            String orderNo = params.get("out_trade_no");
            // 修改订单支付状态
            int effectCount = orderInfoService.updateOrderStatus2Paid(orderNo,OrderInfo.STATUS_ACCOUNT_PAID,OrderInfo.PAYTYPE_ONLINE);
            if (effectCount == 0) {
                // 修改订单支付状态失败---在支付前订单已经超时取消(此时用户的钱已经付出去了)
                // 后续需要走人工客户退款
            }
            return "success";
        }else { // 验签失败
            return "fail";
        }
    }


    @Value("${pay.errorUrl}")
    private String errorUrl;
    @Value("${pay.frontEndPayUrl}")
    private String frontEndPayUrl;
    @RequestMapping("/return_url")
    // 支付宝的同步回调(只做页面展示使用)
    public void returnUrl(@RequestParam HashMap<String,String> params, HttpServletResponse response) throws IOException {
        // 远程调用支付服务的验签功能
        Result<Boolean> result = alipayFeignApi.rsaCheckV1(params);
        if (result == null || result.hasError()) { // 支付不可用---此时用户的钱没付出去
            // 重定向到错误页面
            response.sendRedirect(errorUrl);
            return;
        }
        Boolean flag = result.getData(); // 获取验签结果
        if (flag) { // 验签通过
            // 获取商户订单号
            String orderNo = params.get("out_trade_no");
            // 支付成功---重定向到订单详情页
            response.sendRedirect(frontEndPayUrl + orderNo);
        }else { // 验签失败
            // 重定向到错误页面
            response.sendRedirect(errorUrl);
        }
    }


    @RequestMapping("/refund")
    public Result<String> refund(String orderNo) {
        OrderInfo orderInfo = orderInfoService.find(orderNo);
        // 判断当前订单是否支持退款
        if (orderInfo == null || !OrderInfo.STATUS_ACCOUNT_PAID.equals(orderInfo.getStatus())) { // 不可退款
            return Result.error(SeckillCodeMsg.ORDER_STATUS_CHANGE_ERROR);
        }
        // 可以退款
        if (OrderInfo.PAYTYPE_ONLINE.equals(orderInfo.getPayType())) { // 在线支付退款
            orderInfoService.refundOnline(orderInfo);
        } else { // 积分支付退款
            orderInfoService.refundIntergral(orderInfo);
        }
        return Result.success("退款成功");
    }

}
